/**
 * 
 */
package com.rtsp.tool.snatch;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @author w.weizhen
 * Timer任务线程学习
 * 
 * 自JDK5之后，可以用ScheduledThreadPoolExecutor来替代Timer。
 * 
 * Timer.cancel()与TimerTask.cancel() 
 *     TimerTask.cancel() 只是将当前任务终止，也可以理解为从定时任务（任务队列）中清除掉，但实际上并没有对Timer进行任何操作，
 *         所以在调用 TimerTask.cancel() 时，Timer定时任务（任务队列）中的其它任务还是正常执行，不会影响其它任务的正常执行，
 *         而Timer.cancel() 是将整个定时任务（任务队列）的中的所有任务全部清除。
 *     是不是调用了cancel()后任务会立即结束呢？我们从TimerTask.cancel源码的注释中也可以看到，
 *         If the task is running when this call occurs, the task will run to completion, but will never run again. 
 *         大概意思就是 当调用TimerTask.cancel() 方法时，该任务正在运行中，这项任务会正常运行到结束，但不会再次运行。
 *         同样的在Timer.cancel源码的注释中也可以看到一个类似的解释Does not interfere with a currently executing task 
 *         (if it exists)。翻译为中文大概就是 不干扰当前正在运行的任务（如果存在）。
 *         说明当调用cancel()方法后，当前正在运行的任务还能正常运行下去，还有一口气能把这项任务执行完毕，当任务执行完毕后，
 *         下次不会再执行，而没有开始执行的任务也不会执行。
 * 
 * 多个TimerTask
 *     Timer内部是一个线程
 *     一个Timer可以调度任意多个TimerTask，它会将TimerTask存储在一个队列中，顺序调度，如果想两个TimerTask并发执行，则需要创建两个Timer
 *     所有任务在同一个进程中，一个任务结束之后才会执行另外一个任务
 * 
 * 
 */
public class TimerTaskMain {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		//程序运行时间
        Calendar cd = new GregorianCalendar(2099,13,14);
        //开启一个调度器，它开启的线程名为奥特曼线程
        Timer tm = new Timer("奥特曼线程");
        //第一个调度器开启了，它会在2099年在控制台输出一句话。
        tm.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("调度器一：现在你还在吗？");
            	
            	// 暂停5秒看第二个任务是否正常执行
//                try {
//					Thread.sleep(5000);
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
                
                // 浪费一段时间看第二个任务是否正常执行
                BigDecimal bd_sum = new BigDecimal(0);
                for (int i = 0; i < 999999999; i++) 
                {
                	bd_sum = bd_sum.add(new BigDecimal(Math.random()));
				}
                System.out.println("调度器一：" + bd_sum);
                
                
            }
        },2000,1000);
        //第二个调度器开始了，它会在2秒后在控制台循环输出一句话，间隔是2秒。
        tm.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"调度器二：现在你还在吗？");
                // 停掉当前任务
//                this.cancel();
            }
        },2000,1000);
        
//        try {
//            //五秒后main线程中把调度器关闭
//            Thread.sleep(5000);
//            tm.cancel();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
		
	}
	
}